home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1995 August: Tool Chest / Dev.CD Aug 95 TC / Dev.CD Aug 95 TC.toast / Sample Code / Snippets / Interapplication Communication / ODOC / odoc.c next >
Encoding:
C/C++ Source or Header  |  1992-11-16  |  2.6 KB  |  119 lines  |  [TEXT/KAHL]

  1. /*    open document snippet
  2.     Steven Falkenburg 10/2/91
  3.     
  4.     This sample sends an 'odoc' event to a specified running application
  5.     
  6.     11/16/92 fixed bug in blockmoving target ID name (was moving too much data)
  7. */
  8.  
  9. #include <PPCToolBox.h>
  10. #include <AppleEvents.h>
  11. #include <Aliases.h>
  12.  
  13. void main(void);
  14. void InitStuff(void);
  15. OSErr GetTargetAddress(Str255 prompt,Str255 appStr,PortInfoRec *myPortInfo,
  16.                         AEAddressDesc *targetAddress,TargetID *toTargetID);
  17. OSErr SendODOC(AEAddressDesc *targetAddress,AliasHandle targetFile);
  18. Boolean GetFileToOpen(FSSpec *target);
  19.  
  20. void main(void)
  21. {
  22.     PortInfoRec portInfo;
  23.     AEAddressDesc targetAddress;
  24.     TargetID targetID;
  25.     OSErr err;
  26.     FSSpec fileSpec;
  27.     AliasHandle aliasTarget;
  28.     
  29.     InitStuff();
  30.     
  31.     if (!GetFileToOpen(&fileSpec))
  32.         ExitToShell();
  33.     
  34.     if (GetTargetAddress("\pSpecify target of ODOC:",nil,&portInfo,&targetAddress,&targetID)==noErr) {
  35.         err = NewAlias(nil,&fileSpec,&aliasTarget);
  36.         if (err==noErr) {
  37.             err = SendODOC(&targetAddress,aliasTarget);
  38.             err = AEDisposeDesc(&targetAddress);
  39.             DisposHandle(aliasTarget);
  40.         }
  41.     }
  42. }
  43.  
  44.  
  45. void InitStuff(void)
  46. {
  47.     InitGraf(&qd.thePort);
  48.     InitFonts();
  49.     InitWindows();
  50.     InitMenus();
  51.     TEInit();
  52.     InitDialogs(nil);
  53.     InitCursor();
  54.     FlushEvents(everyEvent,0);
  55. }
  56.  
  57.  
  58. Boolean GetFileToOpen(FSSpec *target)
  59. {
  60.     StandardFileReply sfReply;
  61.     
  62.     StandardGetFile(nil,-1,nil,&sfReply);
  63.     BlockMove(&sfReply.sfFile,target,sizeof(FSSpec));
  64.     
  65.     return sfReply.sfGood;
  66. }
  67.  
  68.  
  69. OSErr GetTargetAddress(Str255 prompt,Str255 appStr,PortInfoRec *myPortInfo,
  70.                         AEAddressDesc *targetAddress,TargetID *toTargetID)
  71. {
  72.     OSErr err;
  73.     
  74.     err = PPCBrowser(prompt,appStr,false,&toTargetID->location,myPortInfo,nil,"\p");
  75.     if (err==noErr) {
  76.         toTargetID->name = myPortInfo->name;
  77.         err = AECreateDesc(typeTargetID,(Ptr)toTargetID,sizeof(TargetID),targetAddress);
  78.     }
  79.     
  80.     return err;
  81. }
  82.  
  83.  
  84. OSErr SendODOC(AEAddressDesc *targetAddress,AliasHandle targetFile)
  85. {
  86.     OSErr err;
  87.     AppleEvent theAE,reply;
  88.     AEDescList descList;
  89.     
  90.     reply.dataHandle = nil;
  91.     
  92.     err = AECreateAppleEvent(kCoreEventClass,kAEOpenDocuments,targetAddress,
  93.                 kAutoGenerateReturnID,kAnyTransactionID,&theAE);
  94.     if (err!=noErr)
  95.         return err;
  96.     
  97.     err = AECreateList(nil,0,false,&descList);
  98.     if (err!=noErr)
  99.         return err;
  100.     
  101.     HLock(targetFile);
  102.     err = AEPutPtr(&descList,0,typeAlias,(Ptr)*targetFile,sizeof(AliasHandle)+(**targetFile).aliasSize);
  103.     HUnlock(targetFile);
  104.     if (err!=noErr)
  105.         return err;
  106.     
  107.     err = AEPutParamDesc(&theAE,keyDirectObject,&descList);
  108.     if (err!=noErr)
  109.         return err;
  110.     
  111.     err = AESend(&theAE,&reply,kAENoReply,kAENormalPriority,kAEDefaultTimeout,nil,nil);
  112.     
  113.     err = AEDisposeDesc(&descList);
  114.     err = AEDisposeDesc(&theAE);
  115.     if (reply.dataHandle)
  116.         err = AEDisposeDesc(&reply);
  117. }
  118.  
  119.